package com.project.class8_15;

import javax.swing.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MyTest {
    public static void main(String[] args) {
//        Dog d1 = new Dog();
//        d1.age = 4;
//        Dog d2 = new Dog();
//        d2.age = 4;
//
////        System.out.println(d1 == d2);
////        System.out.println(d1.equals(d2));
////        //对象.getClass()用于得到，该对象对应的类模版对象
////        System.out.println(d1.getClass() == d2.getClass());
//
//
//        //第一种：类名.class
//        Class c1 = Dog.class;
//        //第二种：对象.getClass()
//        Class c2 = d1.getClass();
//        //第三种：Class.forName("类全路径（包名+类名）")
//        try {
//            Class c3 = Class.forName("com.project.class8_15.Dog");
////            System.out.println(c1 == c2);
////            System.out.println(c1 == c3);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

//        Class c = Dog.class;
//        //得到该类中，公有属性的列表
////        Field[] fs = c.getFields();
//        //得到该类中，所有定义属性的列表
//        Field[] fs = c.getDeclaredFields();
//        for(Field f : fs){
//            //得到属性名
//            System.out.println(f.getName());
//        }
//        System.out.println("------------");
//        //得到该类公有方法列表，包括继承公有方法
////        Method[] ms = c.getMethods();
//        //得到该类定义方法列表，不包括继承的方法
//        Method[] ms = c.getDeclaredMethods();
//        for(Method m : ms){
//            System.out.println(m.getName());
//        }

//        Dog d1 = new Dog();
//        Class c = Dog.class;
//        try {
//            //根据属性名，得到属性对象
//            Field f = c.getDeclaredField("age");
//            //根据方法名，得到方法对象
//            Method m = c.getMethod("speak");
//            //执行指定对象的方法。
//            m.invoke(d1);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

//        String str = JOptionPane.showInputDialog(null,"请输入类的全路径");
//        try {
//            //加载类，得到类模版
//            Class c = Class.forName(str);
//            Method[] ms = c.getMethods();
//            for(Method m : ms){
//                System.out.println(m.getName());
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        Class c = Dog.class;
        try {
            //调用该类中的无参构造方法，产生对象
            Object obj = c.getConstructor().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Dog{
    public int age;
    String name;
    private int money;

    public Dog(){
        System.out.println("创建狗");
    }

    public void speak(){
        System.out.println("说话");
    }

    private void sleep(){
        System.out.println("睡觉");
    }
}